/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.cip.esymons.tesoreria.adapters;

import java.util.ArrayList;
import java.util.List;
import org.cip.esymons.general.util.Utiles;
import org.cip.esymons.tesoreria.be.CuentaIngreso;
import org.cip.esymons.tesoreria.be.DetPagoAgrupado;
import org.cip.esymons.tesoreria.be.EnumTipoCuentaIngreso;
import org.cip.esymons.tesoreria.be.TipoMoneda;

/**
 *
 * @author Gilmar Montoya
 */
public class DeudaCuentaIngreso implements DeudaCuentaIngresoInterfaz {

    private TipoMoneda tipoMoneda;
    private boolean mostrarIGV = false;
    private List<DetPagoAgrupado> listaDeudaxIngreso = new ArrayList<DetPagoAgrupado>();
    private double IGV = 0.0;
    private double igvUtilizar = 0.0;

    public List<DetPagoAgrupado> getListaDeudaxIngreso() {
        return listaDeudaxIngreso;
    }

    public List<DetPagoAgrupado> getListaDeudaxIngresoSeleccionados() {
        List<DetPagoAgrupado> lista = new ArrayList<DetPagoAgrupado>();
        for (DetPagoAgrupado dpci : listaDeudaxIngreso) {
            if (dpci.isSeleccionado()) {
                lista.add(dpci);
            }
        }
        return lista;
    }

    public void setListaDeudaxIngreso(List<DetPagoAgrupado> listaDeudaxIngreso) {
        this.listaDeudaxIngreso = listaDeudaxIngreso;
    }

    public void seleccionarMovimientos() {
        for (DetPagoAgrupado dci : listaDeudaxIngreso) {
            dci.seleccionarMovimientos();
        }
    }

    public List<DetPagoAgrupado> getListaDeudaxIngresoEnMonedaSeleccionada() {
        List<DetPagoAgrupado> listaDeudaxIngresoConIgv = new ArrayList<DetPagoAgrupado>();
        DetPagoAgrupado detPAux = null;    
        for (DetPagoAgrupado detpa : listaDeudaxIngreso) {
            if (detpa.getCuentaIngreso().getFkTmoCodigo() != null) {
                if (!tipoMoneda.equals(detpa.getCuentaIngreso().getFkTmoCodigo())) {
                    if (tipoMoneda.isMonedaDefecto()) {
                        detpa.setValorModificable(Utiles.redondearDouble(detpa.getValor() * detpa.getCuentaIngreso().getFkTmoCodigo().getCambioActual(), 2));
                    } else {
                        if (!detpa.getCuentaIngreso().getFkTmoCodigo().isMonedaDefecto()) {
                            detpa.setValorModificable(Utiles.redondearDouble(detpa.getValor() * tipoMoneda.getCambioActual(), 2));
                        } else {
                            detpa.setValorModificable(Utiles.redondearDouble(detpa.getValor() * (detpa.getCuentaIngreso().getFkTmoCodigo().getCambioActual() / tipoMoneda.getCambioActual()), 2));
                        }
                    }
                }
            }
            if (detpa.getCuentaIngreso().getCinCodigo().equals("000") || detpa.getCuentaIngreso().getTipo().equals(EnumTipoCuentaIngreso.Cuota_CIP) || detpa.getCuentaIngreso().getTipo().equals(EnumTipoCuentaIngreso.Evento)) {
                if (!detpa.isSubDetalle()) {                   
                    listaDeudaxIngresoConIgv.add(detpa);
                    detpa.setListaSubDetalle(new ArrayList<DetPagoAgrupado>());                    
                    detPAux = detpa;
                } else {
                    if (detpa.isSubDetalle()) {
                        detPAux.getListaSubDetalle().add(detpa);
                    }
                }
            } else {
                listaDeudaxIngresoConIgv.add(detpa);
            }
        }      
        for (DetPagoAgrupado dpagru : listaDeudaxIngresoConIgv) {
            if (dpagru.getValorModificable() == null || dpagru.getValorModificable() <= 0) {
                double monto = 0D;
                for (DetPagoAgrupado dpagruSub : dpagru.getListaSubDetalle()) {
                    monto = monto + dpagruSub.getValorModificable();
                }
                dpagru.setValorModificable(Utiles.redondearDouble(monto, 2));
            }
        }


        if (mostrarIGV) {
            Double total = 0.0;
            DetPagoAgrupado deudaUltimo = null;
            Double montoTotal = 0.0;

            for (DetPagoAgrupado deudaPorCuentaIngreso : listaDeudaxIngreso) {
                if (deudaPorCuentaIngreso.getCuentaIngreso() != null) {
                    if (deudaPorCuentaIngreso.getCuentaIngreso().getEsAfectoIgv() != null) {
                        if (deudaPorCuentaIngreso.getCuentaIngreso().getEsAfectoIgv() && deudaPorCuentaIngreso.isSumarAlMonto()) {
                            total += deudaPorCuentaIngreso.getValorModificable();
                        }
                    }
                }
                if (deudaPorCuentaIngreso.isSumarAlMonto() && !deudaPorCuentaIngreso.getCuentaIngreso().getEsAfectoIgv()) {
                    montoTotal = montoTotal + deudaPorCuentaIngreso.getValorModificable();
                }
                deudaUltimo = deudaPorCuentaIngreso;
            }

            if (deudaUltimo != null) {
                //Double igv = Utiles.redondearDouble(total/1.19, 2);//antes x gilmar
                Double igv = Utiles.redondearDouble(((total / (1 + (igvUtilizar/100))) * (igvUtilizar/100)), 2); //modificado x ingrid
                DetPagoAgrupado dci = new DetPagoAgrupado();
                dci.setAnio(deudaUltimo.getAnio());
                CuentaIngreso ci = new CuentaIngreso("000", "Sub Total");
                ci.setFkTmoCodigo(tipoMoneda);
                dci.setDescripcion("SubTotal");
                dci.setValor(Utiles.redondearDouble(montoTotal + (total - igv), 2));
                dci.setValorModificable(Utiles.redondearDouble(montoTotal + (total - igv), 2));
                dci.setCuentaIngreso(ci);
                listaDeudaxIngresoConIgv.add(dci);
                dci = new DetPagoAgrupado();
                dci.setAnio(deudaUltimo.getAnio());
                ci = new CuentaIngreso("000", "IGV");
                ci.setFkTmoCodigo(tipoMoneda);
                dci.setDescripcion("IGV");
                IGV = igv;
                dci.setValor(igv);
                dci.setValorModificable(igv);
                dci.setCuentaIngreso(ci);
                listaDeudaxIngresoConIgv.add(dci);
            }
        }
        return listaDeudaxIngresoConIgv;
    }

    public Double totalDeudaMovimientos() {
        Double monto = 0D;
        for (DetPagoAgrupado dci : listaDeudaxIngreso) {
            if (dci.isSumarAlMonto()) {
                monto += dci.getValorModificable();
            }
        }
        return Utiles.redondearDouble(monto, 2);
    }

    /**
     * @return the tipoMoneda
     */
    public TipoMoneda getTipoMoneda() {
        return tipoMoneda;
    }

    /**
     * @param tipoMoneda the tipoMoneda to set
     */
    public void setTipoMoneda(TipoMoneda tipoMoneda) {
        this.tipoMoneda = tipoMoneda;
    }

    /**
     * @return the mostrarIGV
     */
    public boolean isMostrarIGV() {
        return mostrarIGV;
    }

    /**
     * @param mostrarIGV the mostrarIGV to set
     */
    public void setMostrarIGV(boolean mostrarIGV) {
        this.mostrarIGV = mostrarIGV;
    }

    /**
     * @return the IGV
     */
    public double getIGV() {
        return IGV;
    }

    /**
     * @return the igvUtilizar
     */
    public double getIgvUtilizar() {
        return igvUtilizar;
    }

    /**
     * @param igvUtilizar the igvUtilizar to set
     */
    public void setIgvUtilizar(double igvUtilizar) {
        this.igvUtilizar = igvUtilizar;
    }
}
